# 编译器指定，都是类似宏定义
CXX = g++

# 最终目标可执行文件名称
TARGET = test

# 自动匹配所有 .cpp 文件
# 搜下makefile中wildcard的使用，他是检索目录下所有匹配 *.cpp指明的文件并返回，最终是形成一个所有cpp文件的文件列表，供OBJ节点使用
SRC = $(wildcard *.cpp)

# 将 .cpp 文件转换为 .o 文件。
# 搜下patsubst，是个替换函数，这里查找$(SRC)中，找到*.cpp并替换为*.o
OBJ = $(patsubst %.cpp, %.o, $(SRC))

#编译器的选项配置
CFLAGS = -c

# 目标生成，依赖所有的OBJ
$(TARGET): $(OBJ)
#这里才是调用g++ -o test main.o
	$(CXX) -o $@ $^ 
# $@ 表示目标文件
# $^ 表示所有依赖项

#所有的.o生成规则
%.o: %.cpp
	$(CXX) $(CFLAGS) $< -o $@

# 清理目标, .PHONY 定义伪目标，用于清理中间文件。
PHONY: clean
clean:
	rm -f *.o $(TARGET)
